package com.UnionPayCenter.account.service;

import com.UnionPayCenter.account.entity.Account;
import com.UnionPayCenter.account.enums.AccountTypeEnum;
import com.UnionPayCenter.entity.dto.ChargeResponse;

import java.util.List;

public interface AccountService {

    /**
     * 创建账户
     * 根据商户Id查找账户类型，创建所有类型的账户
     *
     * @param account 账户对象
     */
    void createAccount(Account account);

    /**
     * 冻结账户
     *
     * @param accountId 账户id
     */
    void freezeAccount(Long accountId);

    /**
     * 解冻账户
     *
     * @param accountId 账户id
     */
    void thawAccount(Long accountId);

    /**
     * 注销账户
     *
     * @param accountId 账户Id
     */
    void cancelAccount(Long accountId);

    /**
     * 充值
     * 使用cas，保证数据的一致性
     *
     * @param accountId 账户id
     * @param amount    充值金额
     * @param subOpenId 用户子标识
     * @return true--充值成功，false--充值失败
     */
    ChargeResponse charge(Long accountId, Integer amount, String subOpenId);

    /**
     * 支付
     * 使用cas，保证数据的一致性
     *
     * @param accountId 账户Id
     * @param amount    支付金额
     * @return true--支付成功，false--支付失败
     */
    Boolean pay(Long accountId, Integer amount);

    /**
     * 查询指定用户的账户信息
     *
     * @param userId      用户Id
     * @param accountType 账户类型
     * @return 账户信息
     */
    Account getAccountByUserId(Integer userId, AccountTypeEnum accountType);

    Account getAccountByUserId(Integer userId, AccountTypeEnum accountType, boolean exception);

    /**
     * 根据用户查询账户
     *
     * @param userIds 用户id
     * @return 账户信息
     */
    List<Account> getAccountByUserId(List<Integer> userIds, AccountTypeEnum... accountTypeEnum);

    /**
     * 根据账户Id查询账户信息
     *
     * @param accountId 账户Id
     * @return 账户信息
     */
    Account getAccountByAccountId(Long accountId);

}
